Purpose

During 2020-2021, many hockey leagues (including NHL feeder leagues) had shortened seasons or no season due to the restrictions on play caused by the COVID-19 pandemic. Some players experiencing restrictions on play in played in other leagues or tournaments during the 2021-2022 season. Others did not play any league/tournament games during the 2020-2021 season. This poses the question of whether not playing games during the 2020-2021 COVID season negatively impacted player development (or caused players to get worse). To answer this question, we will examine data from the Ontario Hockey League, which did not play any games during the 2020-2021 season. Some players from this league chose to play in other leagues or tournaments while others did not.

Data

Prep data

Wrangling:

Filtering:

  • 2019-2020 (“pre-COVID”) and 2021-2022 (“post-COVID”) seasons

  • league == OHL

  • Only players who played in the OHL during both pre- and post-COVID seasons

Variables added:

  • points per game per season (combined if a player played for multiple teams in a season)

  • games played per season (combined if a player played for multiple teams in a season)

  • treatment (i.e. whether a player played more than 10 games during the COVID season)

  • age (approximately the oldest a player was in a given season)

  • player quality approximated by ppg in pre-COVID season

  • whether a player was drafted (not totally up to date)

EDA

EDA with confounders: position, age, player quality, treatment(, GP, season)?

check if explanatory variables are correlated with each other and response.

Position

## [1] 219
## [1] 219

## 
## Call:
## lm(formula = ppg_total ~ position, data = ohl_filtered)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.59399 -0.23754 -0.05861  0.21153  1.22954 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.32913    0.02782  11.832  < 2e-16 ***
## positionF    0.26486    0.03491   7.586 2.01e-13 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.3518 on 436 degrees of freedom
## Multiple R-squared:  0.1166, Adjusted R-squared:  0.1146 
## F-statistic: 57.55 on 1 and 436 DF,  p-value: 2.012e-13

#### Player quality

Age

## 
##  16  17  18  19  20  21 
##  37  87 105 114  68  27

Modeling

## 
## Call:
## lm(formula = log(ppg_total) ~ treatment + season + position + 
##     plyr_quality + age, data = filter(ohl_filtered, ppg_total != 
##     0))
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.99539 -0.22503  0.05779  0.23836  1.29327 
## 
## Coefficients:
##                 Estimate Std. Error t value Pr(>|t|)    
## (Intercept)     -1.64116    0.44559  -3.683 0.000261 ***
## treatmentPlayed -0.04555    0.06053  -0.753 0.452164    
## season2021-2022  0.73022    0.06647  10.986  < 2e-16 ***
## positionF        0.20241    0.04949   4.090 5.19e-05 ***
## plyr_quality     2.02727    0.09688  20.925  < 2e-16 ***
## age             -0.02819    0.02569  -1.097 0.273142    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.4443 on 413 degrees of freedom
## Multiple R-squared:  0.6902, Adjusted R-squared:  0.6864 
## F-statistic:   184 on 5 and 413 DF,  p-value: < 2.2e-16

## 
## Call:
## lm(formula = ppg_total ~ treatment * position * season * plyr_quality * 
##     age * drafted, data = ohl_filtered)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.54455 -0.02995  0.00000  0.00000  0.71995 
## 
## Coefficients: (2 not defined because of singularities)
##                                                                          Estimate
## (Intercept)                                                             2.506e-14
## treatmentPlayed                                                        -4.546e-12
## positionF                                                              -8.059e-13
## season2021-2022                                                         2.159e+00
## plyr_quality                                                            1.000e+00
## age                                                                     4.332e-15
## draftedTRUE                                                            -1.151e-10
## treatmentPlayed:positionF                                               1.732e-11
## treatmentPlayed:season2021-2022                                        -1.551e+00
## positionF:season2021-2022                                               3.400e-02
## treatmentPlayed:plyr_quality                                            2.977e-11
## positionF:plyr_quality                                                  7.357e-12
## season2021-2022:plyr_quality                                           -4.543e+00
## treatmentPlayed:age                                                     2.180e-13
## positionF:age                                                           4.440e-14
## season2021-2022:age                                                    -1.009e-01
## plyr_quality:age                                                        3.535e-13
## treatmentPlayed:draftedTRUE                                            -3.032e-10
## positionF:draftedTRUE                                                   1.169e-10
## season2021-2022:draftedTRUE                                             3.133e+01
## plyr_quality:draftedTRUE                                                7.776e-10
## age:draftedTRUE                                                         6.788e-12
## treatmentPlayed:positionF:season2021-2022                               8.137e+00
## treatmentPlayed:positionF:plyr_quality                                 -5.105e-11
## treatmentPlayed:season2021-2022:plyr_quality                           -3.424e+00
## positionF:season2021-2022:plyr_quality                                  2.565e+00
## treatmentPlayed:positionF:age                                          -9.966e-13
## treatmentPlayed:season2021-2022:age                                     7.446e-02
## positionF:season2021-2022:age                                           3.989e-03
## treatmentPlayed:plyr_quality:age                                       -1.632e-12
## positionF:plyr_quality:age                                             -3.969e-13
## season2021-2022:plyr_quality:age                                        2.270e-01
## treatmentPlayed:positionF:draftedTRUE                                   2.906e-10
## treatmentPlayed:season2021-2022:draftedTRUE                             7.396e+01
## positionF:season2021-2022:draftedTRUE                                  -2.620e+01
## treatmentPlayed:plyr_quality:draftedTRUE                                2.187e-11
## positionF:plyr_quality:draftedTRUE                                     -7.807e-10
## season2021-2022:plyr_quality:draftedTRUE                               -2.157e+02
## treatmentPlayed:age:draftedTRUE                                         1.784e-11
## positionF:age:draftedTRUE                                              -6.889e-12
## season2021-2022:age:draftedTRUE                                        -1.656e+00
## plyr_quality:age:draftedTRUE                                           -4.583e-11
## treatmentPlayed:positionF:season2021-2022:plyr_quality                  3.691e+00
## treatmentPlayed:positionF:season2021-2022:age                          -4.154e-01
## treatmentPlayed:positionF:plyr_quality:age                              2.860e-12
## treatmentPlayed:season2021-2022:plyr_quality:age                        1.771e-01
## positionF:season2021-2022:plyr_quality:age                             -1.260e-01
## treatmentPlayed:positionF:season2021-2022:draftedTRUE                  -9.045e+01
## treatmentPlayed:positionF:plyr_quality:draftedTRUE                      9.010e-13
## treatmentPlayed:season2021-2022:plyr_quality:draftedTRUE                1.144e+01
## positionF:season2021-2022:plyr_quality:draftedTRUE                      2.067e+02
## treatmentPlayed:positionF:age:draftedTRUE                              -1.712e-11
## treatmentPlayed:season2021-2022:age:draftedTRUE                        -3.864e+00
## positionF:season2021-2022:age:draftedTRUE                               1.404e+00
## treatmentPlayed:plyr_quality:age:draftedTRUE                           -1.306e-12
## positionF:plyr_quality:age:draftedTRUE                                  4.600e-11
## season2021-2022:plyr_quality:age:draftedTRUE                            1.141e+01
## treatmentPlayed:positionF:season2021-2022:plyr_quality:age             -1.731e-01
## treatmentPlayed:positionF:season2021-2022:plyr_quality:draftedTRUE      1.911e-01
## treatmentPlayed:positionF:season2021-2022:age:draftedTRUE               4.763e+00
## treatmentPlayed:positionF:plyr_quality:age:draftedTRUE                         NA
## treatmentPlayed:season2021-2022:plyr_quality:age:draftedTRUE           -6.749e-01
## positionF:season2021-2022:plyr_quality:age:draftedTRUE                 -1.095e+01
## treatmentPlayed:positionF:season2021-2022:plyr_quality:age:draftedTRUE         NA
##                                                                        Std. Error
## (Intercept)                                                             8.116e-01
## treatmentPlayed                                                         2.074e+00
## positionF                                                               1.066e+00
## season2021-2022                                                         1.216e+00
## plyr_quality                                                            3.233e+00
## age                                                                     4.683e-02
## draftedTRUE                                                             1.946e+01
## treatmentPlayed:positionF                                               5.840e+00
## treatmentPlayed:season2021-2022                                         3.107e+00
## positionF:season2021-2022                                               1.597e+00
## treatmentPlayed:plyr_quality                                            7.196e+00
## positionF:plyr_quality                                                  3.528e+00
## season2021-2022:plyr_quality                                            4.833e+00
## treatmentPlayed:age                                                     1.197e-01
## positionF:age                                                           6.194e-02
## season2021-2022:age                                                     6.623e-02
## plyr_quality:age                                                        1.800e-01
## treatmentPlayed:draftedTRUE                                             4.772e+01
## positionF:draftedTRUE                                                   1.967e+01
## season2021-2022:draftedTRUE                                             2.918e+01
## plyr_quality:draftedTRUE                                                1.307e+02
## age:draftedTRUE                                                         1.146e+00
## treatmentPlayed:positionF:season2021-2022                               8.753e+00
## treatmentPlayed:positionF:plyr_quality                                  1.077e+01
## treatmentPlayed:season2021-2022:plyr_quality                            1.075e+01
## positionF:season2021-2022:plyr_quality                                  5.276e+00
## treatmentPlayed:positionF:age                                           3.406e-01
## treatmentPlayed:season2021-2022:age                                     1.693e-01
## positionF:season2021-2022:age                                           8.760e-02
## treatmentPlayed:plyr_quality:age                                        3.942e-01
## positionF:plyr_quality:age                                              1.973e-01
## season2021-2022:plyr_quality:age                                        2.545e-01
## treatmentPlayed:positionF:draftedTRUE                                   4.752e+01
## treatmentPlayed:season2021-2022:draftedTRUE                             7.157e+01
## positionF:season2021-2022:draftedTRUE                                   2.951e+01
## treatmentPlayed:plyr_quality:draftedTRUE                                1.070e+01
## positionF:plyr_quality:draftedTRUE                                      1.308e+02
## season2021-2022:plyr_quality:draftedTRUE                                1.960e+02
## treatmentPlayed:age:draftedTRUE                                         2.805e+00
## positionF:age:draftedTRUE                                               1.159e+00
## season2021-2022:age:draftedTRUE                                         1.621e+00
## plyr_quality:age:draftedTRUE                                            7.712e+00
## treatmentPlayed:positionF:season2021-2022:plyr_quality                  1.612e+01
## treatmentPlayed:positionF:season2021-2022:age                           4.817e-01
## treatmentPlayed:positionF:plyr_quality:age                              6.081e-01
## treatmentPlayed:season2021-2022:plyr_quality:age                        5.575e-01
## positionF:season2021-2022:plyr_quality:age                              2.791e-01
## treatmentPlayed:positionF:season2021-2022:draftedTRUE                   7.126e+01
## treatmentPlayed:positionF:plyr_quality:draftedTRUE                      2.061e+00
## treatmentPlayed:season2021-2022:plyr_quality:draftedTRUE                1.601e+01
## positionF:season2021-2022:plyr_quality:draftedTRUE                      1.961e+02
## treatmentPlayed:positionF:age:draftedTRUE                               2.793e+00
## treatmentPlayed:season2021-2022:age:draftedTRUE                         3.967e+00
## positionF:season2021-2022:age:draftedTRUE                               1.639e+00
## treatmentPlayed:plyr_quality:age:draftedTRUE                            6.183e-01
## positionF:plyr_quality:age:draftedTRUE                                  7.719e+00
## season2021-2022:plyr_quality:age:draftedTRUE                            1.091e+01
## treatmentPlayed:positionF:season2021-2022:plyr_quality:age              8.600e-01
## treatmentPlayed:positionF:season2021-2022:plyr_quality:draftedTRUE      2.914e+00
## treatmentPlayed:positionF:season2021-2022:age:draftedTRUE               3.950e+00
## treatmentPlayed:positionF:plyr_quality:age:draftedTRUE                         NA
## treatmentPlayed:season2021-2022:plyr_quality:age:draftedTRUE            8.744e-01
## positionF:season2021-2022:plyr_quality:age:draftedTRUE                  1.092e+01
## treatmentPlayed:positionF:season2021-2022:plyr_quality:age:draftedTRUE         NA
##                                                                        t value
## (Intercept)                                                              0.000
## treatmentPlayed                                                          0.000
## positionF                                                                0.000
## season2021-2022                                                          1.776
## plyr_quality                                                             0.309
## age                                                                      0.000
## draftedTRUE                                                              0.000
## treatmentPlayed:positionF                                                0.000
## treatmentPlayed:season2021-2022                                         -0.499
## positionF:season2021-2022                                                0.021
## treatmentPlayed:plyr_quality                                             0.000
## positionF:plyr_quality                                                   0.000
## season2021-2022:plyr_quality                                            -0.940
## treatmentPlayed:age                                                      0.000
## positionF:age                                                            0.000
## season2021-2022:age                                                     -1.524
## plyr_quality:age                                                         0.000
## treatmentPlayed:draftedTRUE                                              0.000
## positionF:draftedTRUE                                                    0.000
## season2021-2022:draftedTRUE                                              1.074
## plyr_quality:draftedTRUE                                                 0.000
## age:draftedTRUE                                                          0.000
## treatmentPlayed:positionF:season2021-2022                                0.930
## treatmentPlayed:positionF:plyr_quality                                   0.000
## treatmentPlayed:season2021-2022:plyr_quality                            -0.319
## positionF:season2021-2022:plyr_quality                                   0.486
## treatmentPlayed:positionF:age                                            0.000
## treatmentPlayed:season2021-2022:age                                      0.440
## positionF:season2021-2022:age                                            0.046
## treatmentPlayed:plyr_quality:age                                         0.000
## positionF:plyr_quality:age                                               0.000
## season2021-2022:plyr_quality:age                                         0.892
## treatmentPlayed:positionF:draftedTRUE                                    0.000
## treatmentPlayed:season2021-2022:draftedTRUE                              1.033
## positionF:season2021-2022:draftedTRUE                                   -0.888
## treatmentPlayed:plyr_quality:draftedTRUE                                 0.000
## positionF:plyr_quality:draftedTRUE                                       0.000
## season2021-2022:plyr_quality:draftedTRUE                                -1.101
## treatmentPlayed:age:draftedTRUE                                          0.000
## positionF:age:draftedTRUE                                                0.000
## season2021-2022:age:draftedTRUE                                         -1.021
## plyr_quality:age:draftedTRUE                                             0.000
## treatmentPlayed:positionF:season2021-2022:plyr_quality                   0.229
## treatmentPlayed:positionF:season2021-2022:age                           -0.862
## treatmentPlayed:positionF:plyr_quality:age                               0.000
## treatmentPlayed:season2021-2022:plyr_quality:age                         0.318
## positionF:season2021-2022:plyr_quality:age                              -0.452
## treatmentPlayed:positionF:season2021-2022:draftedTRUE                   -1.269
## treatmentPlayed:positionF:plyr_quality:draftedTRUE                       0.000
## treatmentPlayed:season2021-2022:plyr_quality:draftedTRUE                 0.714
## positionF:season2021-2022:plyr_quality:draftedTRUE                       1.054
## treatmentPlayed:positionF:age:draftedTRUE                                0.000
## treatmentPlayed:season2021-2022:age:draftedTRUE                         -0.974
## positionF:season2021-2022:age:draftedTRUE                                0.856
## treatmentPlayed:plyr_quality:age:draftedTRUE                             0.000
## positionF:plyr_quality:age:draftedTRUE                                   0.000
## season2021-2022:plyr_quality:age:draftedTRUE                             1.046
## treatmentPlayed:positionF:season2021-2022:plyr_quality:age              -0.201
## treatmentPlayed:positionF:season2021-2022:plyr_quality:draftedTRUE       0.066
## treatmentPlayed:positionF:season2021-2022:age:draftedTRUE                1.206
## treatmentPlayed:positionF:plyr_quality:age:draftedTRUE                      NA
## treatmentPlayed:season2021-2022:plyr_quality:age:draftedTRUE            -0.772
## positionF:season2021-2022:plyr_quality:age:draftedTRUE                  -1.003
## treatmentPlayed:positionF:season2021-2022:plyr_quality:age:draftedTRUE      NA
##                                                                        Pr(>|t|)
## (Intercept)                                                              1.0000
## treatmentPlayed                                                          1.0000
## positionF                                                                1.0000
## season2021-2022                                                          0.0766
## plyr_quality                                                             0.7572
## age                                                                      1.0000
## draftedTRUE                                                              1.0000
## treatmentPlayed:positionF                                                1.0000
## treatmentPlayed:season2021-2022                                          0.6179
## positionF:season2021-2022                                                0.9830
## treatmentPlayed:plyr_quality                                             1.0000
## positionF:plyr_quality                                                   1.0000
## season2021-2022:plyr_quality                                             0.3478
## treatmentPlayed:age                                                      1.0000
## positionF:age                                                            1.0000
## season2021-2022:age                                                      0.1284
## plyr_quality:age                                                         1.0000
## treatmentPlayed:draftedTRUE                                              1.0000
## positionF:draftedTRUE                                                    1.0000
## season2021-2022:draftedTRUE                                              0.2837
## plyr_quality:draftedTRUE                                                 1.0000
## age:draftedTRUE                                                          1.0000
## treatmentPlayed:positionF:season2021-2022                                0.3532
## treatmentPlayed:positionF:plyr_quality                                   1.0000
## treatmentPlayed:season2021-2022:plyr_quality                             0.7502
## positionF:season2021-2022:plyr_quality                                   0.6271
## treatmentPlayed:positionF:age                                            1.0000
## treatmentPlayed:season2021-2022:age                                      0.6603
## positionF:season2021-2022:age                                            0.9637
## treatmentPlayed:plyr_quality:age                                         1.0000
## positionF:plyr_quality:age                                               1.0000
## season2021-2022:plyr_quality:age                                         0.3730
## treatmentPlayed:positionF:draftedTRUE                                    1.0000
## treatmentPlayed:season2021-2022:draftedTRUE                              0.3021
## positionF:season2021-2022:draftedTRUE                                    0.3752
## treatmentPlayed:plyr_quality:draftedTRUE                                 1.0000
## positionF:plyr_quality:draftedTRUE                                       1.0000
## season2021-2022:plyr_quality:draftedTRUE                                 0.2718
## treatmentPlayed:age:draftedTRUE                                          1.0000
## positionF:age:draftedTRUE                                                1.0000
## season2021-2022:age:draftedTRUE                                          0.3078
## plyr_quality:age:draftedTRUE                                             1.0000
## treatmentPlayed:positionF:season2021-2022:plyr_quality                   0.8190
## treatmentPlayed:positionF:season2021-2022:age                            0.3890
## treatmentPlayed:positionF:plyr_quality:age                               1.0000
## treatmentPlayed:season2021-2022:plyr_quality:age                         0.7510
## positionF:season2021-2022:plyr_quality:age                               0.6518
## treatmentPlayed:positionF:season2021-2022:draftedTRUE                    0.2052
## treatmentPlayed:positionF:plyr_quality:draftedTRUE                       1.0000
## treatmentPlayed:season2021-2022:plyr_quality:draftedTRUE                 0.4755
## positionF:season2021-2022:plyr_quality:draftedTRUE                       0.2927
## treatmentPlayed:positionF:age:draftedTRUE                                1.0000
## treatmentPlayed:season2021-2022:age:draftedTRUE                          0.3307
## positionF:season2021-2022:age:draftedTRUE                                0.3924
## treatmentPlayed:plyr_quality:age:draftedTRUE                             1.0000
## positionF:plyr_quality:age:draftedTRUE                                   1.0000
## season2021-2022:plyr_quality:age:draftedTRUE                             0.2961
## treatmentPlayed:positionF:season2021-2022:plyr_quality:age               0.8406
## treatmentPlayed:positionF:season2021-2022:plyr_quality:draftedTRUE       0.9478
## treatmentPlayed:positionF:season2021-2022:age:draftedTRUE                0.2287
## treatmentPlayed:positionF:plyr_quality:age:draftedTRUE                       NA
## treatmentPlayed:season2021-2022:plyr_quality:age:draftedTRUE             0.4407
## positionF:season2021-2022:plyr_quality:age:draftedTRUE                   0.3164
## treatmentPlayed:positionF:season2021-2022:plyr_quality:age:draftedTRUE       NA
##                                                                         
## (Intercept)                                                             
## treatmentPlayed                                                         
## positionF                                                               
## season2021-2022                                                        .
## plyr_quality                                                            
## age                                                                     
## draftedTRUE                                                             
## treatmentPlayed:positionF                                               
## treatmentPlayed:season2021-2022                                         
## positionF:season2021-2022                                               
## treatmentPlayed:plyr_quality                                            
## positionF:plyr_quality                                                  
## season2021-2022:plyr_quality                                            
## treatmentPlayed:age                                                     
## positionF:age                                                           
## season2021-2022:age                                                     
## plyr_quality:age                                                        
## treatmentPlayed:draftedTRUE                                             
## positionF:draftedTRUE                                                   
## season2021-2022:draftedTRUE                                             
## plyr_quality:draftedTRUE                                                
## age:draftedTRUE                                                         
## treatmentPlayed:positionF:season2021-2022                               
## treatmentPlayed:positionF:plyr_quality                                  
## treatmentPlayed:season2021-2022:plyr_quality                            
## positionF:season2021-2022:plyr_quality                                  
## treatmentPlayed:positionF:age                                           
## treatmentPlayed:season2021-2022:age                                     
## positionF:season2021-2022:age                                           
## treatmentPlayed:plyr_quality:age                                        
## positionF:plyr_quality:age                                              
## season2021-2022:plyr_quality:age                                        
## treatmentPlayed:positionF:draftedTRUE                                   
## treatmentPlayed:season2021-2022:draftedTRUE                             
## positionF:season2021-2022:draftedTRUE                                   
## treatmentPlayed:plyr_quality:draftedTRUE                                
## positionF:plyr_quality:draftedTRUE                                      
## season2021-2022:plyr_quality:draftedTRUE                                
## treatmentPlayed:age:draftedTRUE                                         
## positionF:age:draftedTRUE                                               
## season2021-2022:age:draftedTRUE                                         
## plyr_quality:age:draftedTRUE                                            
## treatmentPlayed:positionF:season2021-2022:plyr_quality                  
## treatmentPlayed:positionF:season2021-2022:age                           
## treatmentPlayed:positionF:plyr_quality:age                              
## treatmentPlayed:season2021-2022:plyr_quality:age                        
## positionF:season2021-2022:plyr_quality:age                              
## treatmentPlayed:positionF:season2021-2022:draftedTRUE                   
## treatmentPlayed:positionF:plyr_quality:draftedTRUE                      
## treatmentPlayed:season2021-2022:plyr_quality:draftedTRUE                
## positionF:season2021-2022:plyr_quality:draftedTRUE                      
## treatmentPlayed:positionF:age:draftedTRUE                               
## treatmentPlayed:season2021-2022:age:draftedTRUE                         
## positionF:season2021-2022:age:draftedTRUE                               
## treatmentPlayed:plyr_quality:age:draftedTRUE                            
## positionF:plyr_quality:age:draftedTRUE                                  
## season2021-2022:plyr_quality:age:draftedTRUE                            
## treatmentPlayed:positionF:season2021-2022:plyr_quality:age              
## treatmentPlayed:positionF:season2021-2022:plyr_quality:draftedTRUE      
## treatmentPlayed:positionF:season2021-2022:age:draftedTRUE               
## treatmentPlayed:positionF:plyr_quality:age:draftedTRUE                  
## treatmentPlayed:season2021-2022:plyr_quality:age:draftedTRUE            
## positionF:season2021-2022:plyr_quality:age:draftedTRUE                  
## treatmentPlayed:positionF:season2021-2022:plyr_quality:age:draftedTRUE  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.1901 on 376 degrees of freedom
## Multiple R-squared:  0.7775, Adjusted R-squared:  0.7414 
## F-statistic: 21.54 on 61 and 376 DF,  p-value: < 2.2e-16
## Warning: not plotting observations with leverage one:
##   15, 16

LS0tCnRpdGxlOiAiRG9lcyBOb3QgUGxheWluZyBIb2NrZXkgTWFrZSBZb3UgV29yc2UgYXQgSG9ja2V5PyBQcm9qZWN0IFByb2dyZXNzIDctMTktMjIiCmF1dGhvcjogIkphY2tpZSBKb3Zhbm92aWMsIE1pY2hlbGUgU2V6Z2luIgpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDogb3BlbmludHJvOjpsYWJfcmVwb3J0Ci0tLQoKYGBge3IsIGluY2x1ZGUgPSBGQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UpCmBgYAoKCmBgYHtyIGxvYWQtcGFja2FnZXMsIG1lc3NhZ2U9RkFMU0V9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGx1YnJpZGF0ZSkKYGBgCgojIyMgUHVycG9zZQoKRHVyaW5nIDIwMjAtMjAyMSwgbWFueSBob2NrZXkgbGVhZ3VlcyAoaW5jbHVkaW5nIE5ITCBmZWVkZXIgbGVhZ3VlcykgaGFkIHNob3J0ZW5lZCBzZWFzb25zIG9yIG5vIHNlYXNvbiBkdWUgdG8gdGhlIHJlc3RyaWN0aW9ucyBvbiBwbGF5IGNhdXNlZCBieSB0aGUgQ09WSUQtMTkgcGFuZGVtaWMuIFNvbWUgcGxheWVycyBleHBlcmllbmNpbmcgcmVzdHJpY3Rpb25zIG9uIHBsYXkgaW4gcGxheWVkIGluIG90aGVyIGxlYWd1ZXMgb3IgdG91cm5hbWVudHMgZHVyaW5nIHRoZSAyMDIxLTIwMjIgc2Vhc29uLiBPdGhlcnMgZGlkIG5vdCBwbGF5IGFueSBsZWFndWUvdG91cm5hbWVudCBnYW1lcyBkdXJpbmcgdGhlIDIwMjAtMjAyMSBzZWFzb24uIFRoaXMgcG9zZXMgdGhlIHF1ZXN0aW9uIG9mIHdoZXRoZXIgbm90IHBsYXlpbmcgZ2FtZXMgZHVyaW5nIHRoZSAyMDIwLTIwMjEgQ09WSUQgc2Vhc29uIG5lZ2F0aXZlbHkgaW1wYWN0ZWQgcGxheWVyIGRldmVsb3BtZW50IChvciBjYXVzZWQgcGxheWVycyB0byBnZXQgd29yc2UpLiBUbyBhbnN3ZXIgdGhpcyBxdWVzdGlvbiwgd2Ugd2lsbCBleGFtaW5lIGRhdGEgZnJvbSB0aGUgT250YXJpbyBIb2NrZXkgTGVhZ3VlLCB3aGljaCBkaWQgbm90IHBsYXkgYW55IGdhbWVzIGR1cmluZyB0aGUgMjAyMC0yMDIxIHNlYXNvbi4gU29tZSBwbGF5ZXJzIGZyb20gdGhpcyBsZWFndWUgY2hvc2UgdG8gcGxheSBpbiBvdGhlciBsZWFndWVzIG9yIHRvdXJuYW1lbnRzIHdoaWxlIG90aGVycyBkaWQgbm90LgoKIyMjIERhdGEKCmBgYHtyIGRhdGF9Cm9obCA8LSByZWFkX2NzdigiLi4vc2Ftc19vaGxfZGF0YV9yZXF1ZXN0LmNzdiIpCm9obF9jb3ZpZCA8LSBvaGwgJT4lCiAgZmlsdGVyKHNlYXNvbiAlaW4lIGMoIjIwMTktMjAyMCIsIjIwMjAtMjAyMSIsICIyMDIxLTIwMjIiKSkKYGBgCgojIyMgUHJlcCBkYXRhCgpgYGB7cn0KIyMgQWRkIHRyZWF0bWVudCB2YXI6CgojIEZpbHRlcmluZyBvbmx5IGZvciBwbGF5ZXJzIHdobyBwbGF5ZWQgbW9yZSB0aGFuIDEwIGdhbWVzIChzaG91bGQgd2UgY29tYmluZSBudW1iZXIgb2YgZ2FtZXMgcGxheWVkIGFjcm9zcyBsZWFndWVzPykKb2hsXzIwXzIxIDwtIG9obCAlPiUKICBmaWx0ZXIoc2Vhc29uID09ICIyMDIwLTIwMjEiLCBncCA+IDEwKQoKIyBTcGxpdCBwbGF5ZXJzIHVwIGludG8gdHJlYXRtZW50IHZzIG5vbi10cmVhdG1lbnQKb2hsX3RyZWF0bWVudCA8LSBvaGwgJT4lCiAgZmlsdGVyKHNlYXNvbiAlaW4lIGMoIjIwMTktMjAyMCIsICIyMDIxLTIwMjIiKSwgbGVhZ3VlID09ICJPSEwiKSAlPiUKICBncm91cF9ieShwbGF5ZXJfaWQsIHNlYXNvbikgJT4lCiAgbXV0YXRlKHBwZyA9IHN1bShwdHMpL3N1bShncCksCiAgICAgICAgIHRyZWF0bWVudCA9IGlmZWxzZShwbGF5ZXJfaWQgJWluJSBvaGxfMjBfMjEkcGxheWVyX2lkLCAiUGxheWVkIiwgIkRpZG4ndCBwbGF5IikKICApICU+JQogIHVuZ3JvdXAoKQoKcGx5cl9xdWFsaXR5IDwtIG9obCAlPiUKICBmaWx0ZXIoc2Vhc29uID09ICIyMDE5LTIwMjAiLCBsZWFndWUgPT0gIk9ITCIpICU+JQogIGdyb3VwX2J5KHBsYXllcl9pZCkgJT4lCiAgbXV0YXRlKHBseXJfcXVhbGl0eSA9IHN1bShwdHMpL3N1bShncCkpICU+JQogIGZpbHRlcihkdXBsaWNhdGVkKHBsYXllcl9pZCkgPT0gRkFMU0UpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBzZWxlY3QocGxheWVyX2lkLCBwbHlyX3F1YWxpdHkpCgojIFZpZXcocGx5cl9xdWFsaXR5ICU+JQojICAgZmlsdGVyKGR1cGxpY2F0ZWQocGx5cl9xdWFsaXR5JHBsYXllcl9pZCkgPT0gVFJVRSkpCiMgIyMgbmVlZCB0byBkZWFsIHdpdGggZHVwbGljYXRlIHBsYXllcnMvcm93cwojIFZpZXcob2hsX2ZpbHRlcmVkICU+JQojICAgZmlsdGVyKGR1cGxpY2F0ZWQob2hsX2ZpbHRlcmVkJHBsYXllcl9pZCkgPT0gVFJVRSkpCgoKIyBXZSBuZWVkIHRvIGNoZWNrIHRoYXQgZWFjaCBwbGF5ZXIgcGxheWVkIGluIHRoZSBPSEwgaW4gMjAxOS0yMDIwIGFuZCAyMDIxLTIwMjIKb2hsX3N6biA8LSBvaGwgJT4lCiAgZmlsdGVyKHNlYXNvbiAlaW4lIGMoIjIwMTktMjAyMCIsICIyMDIxLTIwMjIiKSwgbGVhZ3VlID09ICJPSEwiKSAlPiUKICBncm91cF9ieShwbGF5ZXJfaWQpICU+JQogIG11dGF0ZShwbGF5ZWRfMjAxOSA9IHNlYXNvbiA9PSAiMjAxOS0yMDIwIiwKICAgICAgICAgcGxheWVkXzIwMjEgPSBzZWFzb24gPT0gIjIwMjEtMjAyMiIsCiAgICAgICAgIHBsYXllZF9ib3RoX3N6biA9IHN1bShwbGF5ZWRfMjAxOSkgJiBzdW0ocGxheWVkXzIwMjEpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgZmlsdGVyKHBsYXllZF9ib3RoX3N6biA9PSBUUlVFKSAKCiMgYWRkIHRyZWF0bWVudCB2YXJpYWJsZSB0aHJvdWdoIGpvaW4Kb2hsX3RydCA8LSBvaGxfc3puICU+JQogIGxlZnRfam9pbihzZWxlY3Qob2hsX3RyZWF0bWVudCwgcGxheWVyX2lkLCBzZWFzb24sIHRlYW1fbmFtZSwgdHJlYXRtZW50KSwgYnkgPSBjKCJwbGF5ZXJfaWQiLCAidGVhbV9uYW1lIiwgInNlYXNvbiIpKSAlPiUKICBtdXRhdGUocHBnID0gcHRzL2dwKSAKCiMgYWRkIGFnZSB2YXJpYWJsZQpvaGxfYWdlIDwtIG9obF90cnQgJT4lCiAgZ3JvdXBfYnkocGxheWVyX2lkLCBzZWFzb24pICU+JQogIG11dGF0ZSh5ZWFyID0gc3Ryc3BsaXQoc2Vhc29uLCAiLSIpW1sxXV1bMl0pICU+JQogIG11dGF0ZShhZ2UgPSB0cnVuYygoZG9iICUtLSUgYXMuRGF0ZShwYXN0ZTAoeWVhciwgIi0wNS0wMSIpKSkgLyB5ZWFycygxKSkpICU+JQogIHVuZ3JvdXAoKSAjJT4lCiAgI2ZpbHRlcihhZ2UgJWluJSAxNjoyMikKICAgIAojIGFkZCBwbGF5ZXIgcXVhbGl0eQpvaGxfcWx0eSA8LSBvaGxfYWdlICU+JQogIGxlZnRfam9pbihwbHlyX3F1YWxpdHksIGJ5ID0gInBsYXllcl9pZCIpICU+JQogIGdyb3VwX2J5KHBsYXllcl9pZCwgc2Vhc29uKSAlPiUKICBtdXRhdGUocHBnX3RvdGFsID0gc3VtKHB0cykvc3VtKGdwKSwKICAgICAgICAgZ3BfdG90YWwgPSBzdW0oZ3ApLAogICAgICAgICBwdHNfdG90YWwgPSBzdW0ocHRzKSkgJT4lCiAgYXJyYW5nZShwbGF5ZXJfaWQsIHNlYXNvbiwgLXBseXJfcXVhbGl0eSkgJT4lCiAgZmlsdGVyKGR1cGxpY2F0ZWQocGxheWVyX2lkKSA9PSBGQUxTRSkgJT4lCiAgdW5ncm91cCgpIyU+JQogICMgZmlsdGVyKHBwZyAhPSAwKSAlPiUKICAjIG11dGF0ZShsb2dfcHBnID0gbG9nKHBwZykpCgojIHdlcmUgdGhleSBkcmFmdGVkCm9obF9maWx0ZXJlZCA8LSBvaGxfcWx0eSAlPiUKICBtdXRhdGUoZHJhZnRlZCA9ICFpcy5uYShkcmFmdF95ZWFyKSkgJT4lCiAgc2VsZWN0KHNlYXNvbiwgcGxheWVyX2lkLCB0cmVhdG1lbnQsIGZpcnN0X25hbWUsIGxhc3RfbmFtZSwgcG9zaXRpb24sIHBseXJfcXVhbGl0eSwgYWdlLCBncF90b3RhbCwgcHRzX3RvdGFsLCBwcGdfdG90YWwsIGRyYWZ0ZWQsIGRyYWZ0X3llYXIsIHJvdW5kLCBvdmVyYWxsX3BpY2tfbnVtLCBzaG9vdHMpCgojIyBUcnlpbmcgdG8gY29tYmluZSBwbGF5ZXJzIHdobyBwbGF5ZWQgZm9yIHR3byB0ZWFtcyBpbnRvIG9uZQoKIyBjb21iaW5lZCA8LSBvaGxfZmlsdGVyZWQgJT4lCiAgCgpvaGxfdHJlYXRtZW50XzIxXzIyIDwtIG9obF9maWx0ZXJlZCAlPiUKICBmaWx0ZXIoc2Vhc29uID09ICIyMDIxLTIwMjIiKQpgYGAKCldyYW5nbGluZzoKCkZpbHRlcmluZzoKCi0gMjAxOS0yMDIwICgicHJlLUNPVklEIikgYW5kIDIwMjEtMjAyMiAoInBvc3QtQ09WSUQiKSBzZWFzb25zCgotIGxlYWd1ZSA9PSBPSEwKCi0gT25seSBwbGF5ZXJzIHdobyBwbGF5ZWQgaW4gdGhlIE9ITCBkdXJpbmcgYm90aCBwcmUtIGFuZCBwb3N0LUNPVklEIHNlYXNvbnMKClZhcmlhYmxlcyBhZGRlZDoKCi0gcG9pbnRzIHBlciBnYW1lIHBlciBzZWFzb24gKGNvbWJpbmVkIGlmIGEgcGxheWVyIHBsYXllZCBmb3IgbXVsdGlwbGUgdGVhbXMgaW4gYSBzZWFzb24pCgotIGdhbWVzIHBsYXllZCBwZXIgc2Vhc29uIChjb21iaW5lZCBpZiBhIHBsYXllciBwbGF5ZWQgZm9yIG11bHRpcGxlIHRlYW1zIGluIGEgc2Vhc29uKQoKLSB0cmVhdG1lbnQgKGkuZS4gd2hldGhlciBhIHBsYXllciBwbGF5ZWQgbW9yZSB0aGFuIDEwIGdhbWVzIGR1cmluZyB0aGUgQ09WSUQgc2Vhc29uKQoKLSBhZ2UgKGFwcHJveGltYXRlbHkgdGhlIG9sZGVzdCBhIHBsYXllciB3YXMgaW4gYSBnaXZlbiBzZWFzb24pCgotIHBsYXllciBxdWFsaXR5IGFwcHJveGltYXRlZCBieSBwcGcgaW4gcHJlLUNPVklEIHNlYXNvbgoKLSB3aGV0aGVyIGEgcGxheWVyIHdhcyBkcmFmdGVkIChub3QgdG90YWxseSB1cCB0byBkYXRlKQoKIyMjIEVEQQoKIyMjIyBFREEgd2l0aCBjb25mb3VuZGVyczogcG9zaXRpb24sIGFnZSwgcGxheWVyIHF1YWxpdHksIHRyZWF0bWVudCgsIEdQLCBzZWFzb24pPwoKY2hlY2sgaWYgZXhwbGFuYXRvcnkgdmFyaWFibGVzIGFyZSBjb3JyZWxhdGVkIHdpdGggZWFjaCBvdGhlciBhbmQgcmVzcG9uc2UuIAoKYGBge3J9CmxpYnJhcnkoR0dhbGx5KQoKb2hsX2ZpbHRlcmVkICU+JQogIHNlbGVjdChzZWFzb24sIHBvc2l0aW9uLCBhZ2UsIHBwZ190b3RhbCwgcGx5cl9xdWFsaXR5LCBncF90b3RhbCwgdHJlYXRtZW50KSAlPiUKICBnZ3BhaXJzKCkKYGBgCgpgYGB7cn0KIyBpcyBncCBjb3JyZWxhdGVkIHdpdGggcHBnPwpnZ3Bsb3Qob2hsX2ZpbHRlcmVkLCBhZXMoeCA9IGdwX3RvdGFsLCB5ID0gcHBnX3RvdGFsKSkgKwogIGdlb21fcG9pbnQoKSArCiAgbGFicyh0aXRsZSA9ICJSZWxhdGlvbnNoaXAgYmV0d2VlbiBQUEcgYW5kIEdQIiwgeCA9ICJUb3RhbCBHUCIsIHkgPSAiVG90YWwgUFBHIikjKwogICNnZW9tX3Ntb290aCgpCgpnZ3Bsb3Qob2hsX2ZpbHRlcmVkLCBhZXMoeCA9IGdwX3RvdGFsLCB5ID0gbG9nKHBwZ190b3RhbCkpKSArCiAgZ2VvbV9wb2ludCgpICsKICBsYWJzKHRpdGxlID0gIkxvZyByZWxhdGlvbnNoaXAgYmV0d2VlbiBQUEcgYW5kIEdQIiwgeCA9ICJUb3RhbCBHUCIsIHkgPSAiVG90YWwgUFBHIikjKwogICNnZW9tX3Ntb290aCgpCmBgYAoKIyMjIyAqKlBvc2l0aW9uKioKCmBgYHtyfQojIGRlbnNpdHkgY3VydmUgb2YgcHBnIGZhY2V0ZWQgYnkgcG9zaXRpb24KZ2dwbG90KG9obF9maWx0ZXJlZCkgKwogIGdlb21fZGVuc2l0eShhZXMoeCA9IHBwZ190b3RhbCkpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKHBvc2l0aW9uKSkgKwogIGxhYnModGl0bGUgPSAiUFBHIGdlbmVyYWxseSBncmVhdGVyIGZvciBmb3J3YXJkcyBpbiAyMDE5LTIwIGFuZCAyMDIxLTIyIHNlYXNvbiIpCmBgYAoKYGBge3J9CiMgZGVuc2l0eSBjdXJ2ZSBvZiBwcGcgZmFjZXRlZCBieSBwb3NpdGlvbgpnZ3Bsb3Qob2hsX2ZpbHRlcmVkKSArCiAgZ2VvbV9kZW5zaXR5KGFlcyh4ID0gcHBnX3RvdGFsLCBjb2xvciA9IHNlYXNvbikpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKHBvc2l0aW9uKSkgKwogIGxhYnModGl0bGUgPSAiUFBHIGdlbmVyYWxseSBoaWdoZXIgaW4gMjAyMS0yMDIyIHNlYXNvbiwgcmVnYXJkbGVzcyBvZiBwb3NpdGlvbiIsCiAgICAgICB4ID0gIlBQRyIpCmBgYAoKYGBge3J9CiMgbWF5YmUgZHVlIHRvIGEgZGlmZmVyZW5jZSBpbiBhbW91bnQgb2YgZGF0YSBwZXIgc2Vhc29uPwpucm93KGZpbHRlcihvaGxfZmlsdGVyZWQsIHNlYXNvbiA9PSAiMjAxOS0yMDIwIikpCm5yb3coZmlsdGVyKG9obF9maWx0ZXJlZCwgc2Vhc29uID09ICIyMDIxLTIwMjIiKSkKYGBgCgpgYGB7cn0KZ2dwbG90KG9obF90cmVhdG1lbnRfMjFfMjIpICsKICBnZW9tX2RlbnNpdHkoYWVzKHggPSBwcGdfdG90YWwsIGNvbG9yID0gdHJlYXRtZW50KSkgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMocG9zaXRpb24pKSArCiAgbGFicyh0aXRsZSA9ICJQUEcgZ2VuZXJhbGx5IGhpZ2hlciBmb3IgdGhvc2Ugd2hvIHBsYXllZCBkdXJpbmcgQ09WSUQgc2Vhc29uIGluIDIwMjEtMjIgc2Vhc29uIikKYGBgCgpgYGB7cn0KZ2dwbG90KG9obF90cmVhdG1lbnRfMjFfMjIsIGFlcyh4ID0gYXMuZmFjdG9yKHBvc2l0aW9uKSwgeSA9IHBwZ190b3RhbCkpICsKICBnZW9tX3BvaW50KGFscGhhID0gLjIpICsKICBzdGF0X3N1bW1hcnkoZ2VvbSA9ICJsaW5lIiwgZnVuID0gbWVhbiwgZ3JvdXAgPSAxKSAKYGBgCgpgYGB7cn0KIyB2aW9sYXRlcyBjb25zdGFudCB2YXJpYW5jZS4uLiBtdWNoIG1vcmUgdmFyaWFuY2UgYW1vbmcgZm9yd2FyZHMgdGhhbiBEcwpsbV9wb3MgPC0gbG0ocHBnX3RvdGFsIH4gcG9zaXRpb24sIGRhdGEgPSBvaGxfZmlsdGVyZWQpCnN1bW1hcnkobG1fcG9zKQpwbG90KGxtX3BvcykKYGBgCiMjIyMgKipQbGF5ZXIgcXVhbGl0eSoqCgpgYGB7cn0KZ2dwbG90KG9obF9maWx0ZXJlZCwgYWVzKHggPSApKQpgYGAKCgojIyMjICoqQWdlKioKCmBgYHtyfQpnZ3Bsb3Qob2hsX2ZpbHRlcmVkLCBhZXMoeCA9IHBwZ190b3RhbCkpICsKICBnZW9tX2RlbnNpdHkoKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhhZ2UpKQpgYGAKCmBgYHtyfQpnZ3Bsb3Qob2hsX2ZpbHRlcmVkLCBhZXMoeCA9IGFnZSwgeSA9IHBseXJfcXVhbGl0eSkpICsKICBnZW9tX3BvaW50KGFscGhhID0gLjUpIAoKbGlicmFyeShnZ3JpZGdlcykKZ2dwbG90KG9obF9maWx0ZXJlZCwgYWVzKHggPSBwbHlyX3F1YWxpdHkpKSArCiAgZ2VvbV9kZW5zaXR5X3JpZGdlcyhhZXMoeSA9IGFzLmZhY3RvcihhZ2UpKSkgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoYWdlKSkgKwogIGxhYnModGl0bGUgPSAiUGxheWVyIHF1YWxpdHkgZ2VuZXJhbGx5IGluY3JlYXNlcyB3aXRoIGFnZSIpCmBgYAoKYGBge3J9CnBsb3QobG0ocGx5cl9xdWFsaXR5IH4gYWdlLCBkYXRhID0gb2hsX2ZpbHRlcmVkKSkKYGBgCgoKYGBge3J9Cm1vc2FpY3Bsb3QodGFibGUoIkFnZSIgPSBvaGxfZmlsdGVyZWQkYWdlLAogICAgICAgICAgICAgICAgICJQb3NpdGlvbiIgPSBvaGxfZmlsdGVyZWQkcG9zaXRpb24pLAogICAgICAgICAgIG1haW4gPSAiUG9zaXRpb24gaW5kZXBlbmRlbnQgb2YgYWdlIiwKICAgICAgICAgICBzaGFkZSA9IFRSVUUpCmBgYApgYGB7cn0KIyBhZ2UgdnMgdHJlYXRtZW50Cm1vc2FpY3Bsb3QodGFibGUoIkFnZSIgPSBvaGxfZmlsdGVyZWQkYWdlLAogICAgICAgICAgICAgICAgICJUcmVhdG1lbnQiID0gb2hsX2ZpbHRlcmVkJHRyZWF0bWVudCksCiAgICAgICAgICAgbWFpbiA9ICJQbGF5aW5nIGR1cmluZyBDT1ZJRCBzZWFzb24gaW5kZXBlbmRlbnQgb2YgYWdlIiwKICAgICAgICAgICBzaGFkZSA9IFRSVUUpCmBgYAoKYGBge3J9CiMgYWdlIHZzIGdwCmdncGxvdChvaGxfZmlsdGVyZWQsIGFlcyh4ID0gYWdlLCB5ID0gZ3BfdG90YWwpKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IC41KQpnZ3Bsb3Qob2hsX2ZpbHRlcmVkLCBhZXMoeCA9IGdwX3RvdGFsKSkgKwogIGdlb21fZGVuc2l0eSgpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGFnZSkpCnRhYmxlKG9obF9maWx0ZXJlZCRhZ2UpCmBgYAoKCiMjIyBNb2RlbGluZwoKYGBge3IsIHdhcm5pbmcgPSBUUlVFfQojIHZhbmlsbGEgTUxSCm1sciA8LSBsbShwcGdfdG90YWwgfiB0cmVhdG1lbnQgKyBzZWFzb24gKyBwb3NpdGlvbiArIHBseXJfcXVhbGl0eSArIGFnZSwgZGF0YSA9IG9obF9maWx0ZXJlZCkKbWxyX3N1bW1hcnkgPC0gc3VtbWFyeShtbHIpCnBsb3QobWxyKQoKIyBwcGcgb24gbG9nIHNjYWxlCmxvZ19tbHIgPC0gbG0obG9nKHBwZ190b3RhbCkgfiB0cmVhdG1lbnQgKyBzZWFzb24gKyBwb3NpdGlvbiArIHBseXJfcXVhbGl0eSArIGFnZSwgZGF0YSA9IGZpbHRlcihvaGxfZmlsdGVyZWQsIHBwZ190b3RhbCAhPSAwKSkKc3VtbWFyeShsb2dfbWxyKQpwbG90KGxvZ19tbHIpCgptbHJfaW50IDwtIGxtKHBwZ190b3RhbCB+IHRyZWF0bWVudCpwb3NpdGlvbipzZWFzb24qcGx5cl9xdWFsaXR5KmFnZSpkcmFmdGVkLCBkYXRhID0gb2hsX2ZpbHRlcmVkKQpzdW1tYXJ5KG1scl9pbnQpCnBsb3QobWxyX2ludCkKYGBgCgpgYGB7cn0Kb2hsX21vZCA8LSBvaGxfZmlsdGVyZWQgJT4lCiAgbXV0YXRlKHJlc2lkcyA9IG1scl9zdW1tYXJ5JHJlc2lkID4gLjMpCmBgYAoKYGBge3J9Cm1vc2FpY3Bsb3QodGFibGUoIlBvc2l0aW9uIiA9IG9obF9tb2QkcG9zaXRpb24sCiAgICAgICAgICAgICAgICAgIlJlc2lkcyIgPSBvaGxfbW9kJHJlc2lkcyksCiAgICAgICAgICAgbWFpbiA9ICIiLAogICAgICAgICAgIHNoYWRlID0gVFJVRSkKbW9zYWljcGxvdCh0YWJsZSgiU2hvb3RzIiA9IG9obF9tb2Qkc2hvb3RzLAogICAgICAgICAgICAgICAgICJSZXNpZHMiID0gb2hsX21vZCRyZXNpZHMpLAogICAgICAgICAgIG1haW4gPSAiIiwKICAgICAgICAgICBzaGFkZSA9IFRSVUUpCm1vc2FpY3Bsb3QodGFibGUoIkRyYWZ0ZWQiID0gb2hsX21vZCRkcmFmdGVkLAogICAgICAgICAgICAgICAgICJSZXNpZHMiID0gb2hsX21vZCRyZXNpZHMpLAogICAgICAgICAgIG1haW4gPSAiIiwKICAgICAgICAgICBzaGFkZSA9IFRSVUUpCmBgYAoKCgoKLi4uCgo=